TYPE UDT 1
VERSION : 0.1
STRUCT
	VAR1_INT	: INT		:= 11;
	VAR2_DINT	: DINT		:= L#22;
	VAR3_DWORD	: DWORD;
	VAR4_REAL	: REAL;
	VAR5_BOOL	: BOOL		:= TRUE;
	VAR6_BOOL	: BOOL;
	VAR7_INT	: INT		:= 42;
	VAR8_UDT2	: UDT 2;
END_STRUCT;
END_TYPE


TYPE UDT 2
VERSION : 0.1
STRUCT
	VAR0_INT	: INT		:= 101;
	VAR1_BOOL	: BOOL;
	VAR2_BOOL	: BOOL		:= TRUE;
	VAR3_DINT	: DINT		:= L#102;
END_STRUCT;
END_TYPE


DATA_BLOCK DB 1
STRUCT
	DBVAR_UDT1	: UDT 1;
	DBVAR2		: INT;
END_STRUCT;
BEGIN
	DBVAR2		:= 99;
END_DATA_BLOCK


FUNCTION FC 1 : VOID
VAR_INPUT
	FCINVAR_UDT1	: UDT 1;
	FCINVAR_INT	: INT;
END_VAR
BEGIN
	L		#FCINVAR_UDT1.VAR1_INT
	__ASSERT==	__ACCU 1,	11
	L		#FCINVAR_UDT1.VAR2_DINT
	__ASSERT==	__ACCU 1,	22
	L		#FCINVAR_UDT1.VAR3_DWORD
	__ASSERT==	__ACCU 1,	0
	L		#FCINVAR_UDT1.VAR4_REAL
	__ASSERT==	__ACCU 1,	0.0
	U		#FCINVAR_UDT1.VAR5_BOOL
	__ASSERT==	__STW VKE,	1
	U		#FCINVAR_UDT1.VAR6_BOOL
	__ASSERT==	__STW VKE,	0
	L		#FCINVAR_UDT1.VAR7_INT
	__ASSERT==	__ACCU 1,	42
	L		#FCINVAR_UDT1.VAR8_UDT2.VAR0_INT
	__ASSERT==	__ACCU 1,	101
	U		#FCINVAR_UDT1.VAR8_UDT2.VAR1_BOOL
	__ASSERT==	__STW VKE,	0
	U		#FCINVAR_UDT1.VAR8_UDT2.VAR2_BOOL
	__ASSERT==	__STW VKE,	1
	L		#FCINVAR_UDT1.VAR8_UDT2.VAR3_DINT
	__ASSERT==	__ACCU 1,	102


	L		#FCINVAR_INT
	__ASSERT==	__ACCU 1,	123
END_FUNCTION


FUNCTION_BLOCK FB 1
VAR_INPUT
	FBINVAR_UDT1	: UDT 1;
	FBINVAR_INT	: INT;
END_VAR
BEGIN
	L		#FBINVAR_UDT1.VAR1_INT
	__ASSERT==	__ACCU 1,	11
	L		#FBINVAR_UDT1.VAR2_DINT
	__ASSERT==	__ACCU 1,	22
	L		#FBINVAR_UDT1.VAR3_DWORD
	__ASSERT==	__ACCU 1,	0
	L		#FBINVAR_UDT1.VAR4_REAL
	__ASSERT==	__ACCU 1,	0.0
	U		#FBINVAR_UDT1.VAR5_BOOL
	__ASSERT==	__STW VKE,	1
	U		#FBINVAR_UDT1.VAR6_BOOL
	__ASSERT==	__STW VKE,	0
	L		#FBINVAR_UDT1.VAR7_INT
	__ASSERT==	__ACCU 1,	42
	L		#FBINVAR_UDT1.VAR8_UDT2.VAR0_INT
	__ASSERT==	__ACCU 1,	101
	U		#FBINVAR_UDT1.VAR8_UDT2.VAR1_BOOL
	__ASSERT==	__STW VKE,	0
	U		#FBINVAR_UDT1.VAR8_UDT2.VAR2_BOOL
	__ASSERT==	__STW VKE,	1
	L		#FBINVAR_UDT1.VAR8_UDT2.VAR3_DINT
	__ASSERT==	__ACCU 1,	102


	L		#FBINVAR_INT
	__ASSERT==	__ACCU 1,	123
END_FUNCTION_BLOCK


DATA_BLOCK DB 2
	FB 1
BEGIN
END_DATA_BLOCK


ORGANIZATION_BLOCK OB 1
BEGIN
	// Check DB 1 initial values
	AUF		DB 1
	L		DBW 0	// DBVAR_UDT1.VAR1_INT
	__ASSERT==	__ACCU 1,	11
	L		DBD 2	// DBVAR_UDT1.VAR2_DINT
	__ASSERT==	__ACCU 1,	22
	L		DBD 6	// DBVAR_UDT1.VAR3_DWORD
	__ASSERT==	__ACCU 1,	0
	L		DBD 10	// DBVAR_UDT1.VAR4_REAL
	__ASSERT==	__ACCU 1,	0.0
	L		DBB 14	// DBVAR_UDT1.VAR5/6_BOOL
	__ASSERT==	__ACCU 1,	1
	L		DBB 15	// Reserved space after VAR6_BOOL
	__ASSERT==	__ACCU 1,	0
	L		DBW 16	// DBVAR_UDT1.VAR7_INT
	__ASSERT==	__ACCU 1,	42
	L		DBW 18	// DBVAR_UDT1.VAR8_UDT2.VAR0_INT
	__ASSERT==	__ACCU 1,	101
	L		DBB 20	// DBVAR_UDT1.VAR8_UDT2.VAR1/2_BOOL
	__ASSERT==	__ACCU 1,	2
	L		DBB 21	// Reserved space after VAR2_BOOL
	__ASSERT==	__ACCU 1,	0
	L		DBD 22	// DBVAR_UDT1.VAR8_UDT2.VAR3_DINT
	__ASSERT==	__ACCU 1,	102
	L		DBW 26	// DBVAR2
	__ASSERT==	__ACCU 1,	99

	// Check DB 1 initial values (symbolic access)
	L		DB1.DBVAR_UDT1.VAR1_INT
	__ASSERT==	__ACCU 1,	11
	L		DB1.DBVAR_UDT1.VAR2_DINT
	__ASSERT==	__ACCU 1,	22
	L		DB1.DBVAR_UDT1.VAR3_DWORD
	__ASSERT==	__ACCU 1,	0
	L		DB1.DBVAR_UDT1.VAR4_REAL
	__ASSERT==	__ACCU 1,	0.0
	U		DB1.DBVAR_UDT1.VAR5_BOOL
	__ASSERT==	__STW VKE,	1
	U		DB1.DBVAR_UDT1.VAR6_BOOL
	__ASSERT==	__STW VKE,	0
	L		DB1.DBVAR_UDT1.VAR7_INT
	__ASSERT==	__ACCU 1,	42
	L		DB1.DBVAR_UDT1.VAR8_UDT2.VAR0_INT
	__ASSERT==	__ACCU 1,	101
	U		DB1.DBVAR_UDT1.VAR8_UDT2.VAR1_BOOL
	__ASSERT==	__STW VKE,	0
	U		DB1.DBVAR_UDT1.VAR8_UDT2.VAR2_BOOL
	__ASSERT==	__STW VKE,	1
	L		DB1.DBVAR_UDT1.VAR8_UDT2.VAR3_DINT
	__ASSERT==	__ACCU 1,	102
	L		DB1.DBVAR2
	__ASSERT==	__ACCU 1,	99


	// Check DB 2 initial values
	AUF		DB 2
	L		DBW 0	// FBINVAR_UDT1.VAR1_INT
	__ASSERT==	__ACCU 1,	11
	L		DB2.FBINVAR_UDT1.VAR1_INT
	__ASSERT==	__ACCU 1,	11
	L		DBD 2	// FBINVAR_UDT1.VAR2_DINT
	__ASSERT==	__ACCU 1,	22
	L		DB2.FBINVAR_UDT1.VAR2_DINT
	__ASSERT==	__ACCU 1,	22


	// UDT-passing to FB
	CALL	FB 1, DB 2 (
		FBINVAR_UDT1	:= DB1.DBVAR_UDT1,
		FBINVAR_INT	:= 123,
	)


	// UDT-passing to FC
	CALL	FC 1 (
		FCINVAR_UDT1	:= DB1.DBVAR_UDT1,
		FCINVAR_INT	:= 123,
	)


	CALL SFC 46 // STOP CPU
END_ORGANIZATION_BLOCK
